﻿using System;
using System.ComponentModel;
using System.Collections.Generic;
using Kaesoft.Hospedaje.Entities;
using Kaesoft.Hospedaje.Proxy.AdministracionReference;

namespace Kaesoft.Hospedaje.Proxy
{
    /// <summary>
    /// Proxy para el servicio de administracion
    /// </summary>
    public class ProxyAdministracion
    {
        #region Campos Privados
        private static ServicioAdministracionClient _clientStatic;
        #endregion

        #region Constructores
        /// <summary>
        /// Crea una instancia del proxy
        /// </summary>
        static ProxyAdministracion()
        {
            _clientStatic = new ServicioAdministracionClient(EndpointNames.EndpointServicioAdministracion);
            _clientStatic.Endpoint.Behaviors.Add(new CustomInspectorBehavior());
            WcfProxyInvoker.UsuarioLogged += (o, e) => RefrescarCredenciales();
            WcfProxyInvoker.GrabarCredenciales(_clientStatic.ClientCredentials);
        }

        public static void RefrescarCredenciales()
        {
            _clientStatic = new ServicioAdministracionClient(EndpointNames.EndpointServicioAdministracion);
            _clientStatic.Endpoint.Behaviors.Add(new CustomInspectorBehavior());
            WcfProxyInvoker.GrabarCredenciales(_clientStatic.ClientCredentials);
        }

        /// <summary>
        /// Crea una instancia del proxy
        /// </summary>
        public ProxyAdministracion()
        {
            WcfProxyInvoker.AdministrationProxy = this;
            //Set client credentials for DMZ
            WcfProxyInvoker.UsuarioLogged += (o, e) => WcfProxyInvoker.GrabarCredenciales(_clientStatic.ClientCredentials);
            WcfProxyInvoker.GrabarCredenciales(_clientStatic.ClientCredentials);
        }
        #endregion

        #region Metodos Publicos

        public static void ValidarCredencialesAsync(string login, string pass, Action<ValidarCredencialesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ValidarCredencialesAsync", login, pass, method);
        }

        public static void ObtenerPerfilesAsync(Action<ObtenerPerfilesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerPerfilesAsync", method);
        }

        public static void ObtenerUsuariosPorCriteriosAsync(int tipoConsulta, string criterio, int indice, Action<ObtenerUsuariosPorCriteriosCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerUsuariosPorCriteriosAsync", tipoConsulta, criterio, indice, method);
        }

        public static void GrabarUsuariosAsync(List<Usuario> usuarios, Action<AsyncCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "GrabarUsuariosAsync", usuarios, method);
        }

        public static void ListarArbolPerfilesAsync(Action<ListarArbolPerfilesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ListarArbolPerfilesAsync", method);
        }

        public static void ListarArbolOpcionesAsync(Action<ListarArbolOpcionesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ListarArbolOpcionesAsync", method);
        }

        public static void ListarArbolOpcionesPorIdAsync(Guid idOpcion, Action<ListarArbolOpcionesPorIdCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ListarArbolOpcionesPorIdAsync", idOpcion, method);
        }

        public static void ListarOperacionesAsync(Action<ListarOperacionesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ListarOperacionesAsync", method);
        }

        public static void ObtenerPerfilPorIdAsync(Guid idPerfil, Action<ObtenerPerfilPorIdCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerPerfilPorIdAsync", idPerfil, method);
        }

        public static void ObtenerOperacionPorPerfilYOpcionAsync(Guid idPerfil, Guid idOpcion, Action<ObtenerOperacionPorPerfilYOpcionCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerOperacionPorPerfilYOpcionAsync", idPerfil, idOpcion, method);
        }
        public static void InsertarNuevoPerfilAsync(Perfil nuevoPerfil, Action<InsertarNuevoPerfilCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "InsertarNuevoPerfilAsync", nuevoPerfil, method);
        }
        public static void ActualizaPerfilAsync(string perfilNombre, Guid perfilId, List<PerfilOpcion> poEliminar, List<PerfilOpcion> poAgregar, List<PerfilOpcionOperacion> pooEliminar, List<PerfilOpcionOperacion> pooAgregar, Action<ActualizaPerfilCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ActualizaPerfilAsync", perfilNombre, perfilId, poEliminar, poAgregar, pooEliminar, pooAgregar, method);
        }

        public static void EliminaPerfilesAsync(List<Perfil> perfiles, Action<EliminaPerfilesCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "EliminaPerfilesAsync", perfiles, method);
        }

        public static void ObtenerPerfilPorNombreAsync(string nombrePerfil, Action<ObtenerPerfilPorNombreCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerPerfilPorNombreAsync", nombrePerfil, method);
        }

        public static void RestaurarClaveAsync(Guid idUsuarioResetear, Action<AsyncCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "RestaurarClaveAsync", idUsuarioResetear, method);
        }

        public static void ValidaUsuarioAsync(Usuario usuarioValidar, Action<ValidaUsuarioCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ValidaUsuarioAsync", usuarioValidar, method);
        }
        public static void GuardarPerfilOpcionAsync(string perfilNombre, Guid perfilId, List<PerfilOpcion> poAgregar, Action<GuardarPerfilOpcionCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "GuardarPerfilOpcionAsync", perfilNombre, perfilId, poAgregar, method);
        }

        public static void ObtenerDatosOpcionOperacionAsync(Guid idPerfil, Guid idOpcion, Action<ObtenerDatosOpcionOperacionCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerDatosOpcionOperacionAsync", idPerfil, idOpcion, method);
        }

        public static void GuardaOperacionAsync(PerfilOpcion PropiedadPerfilOpcion, Action<AsyncCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "GuardaOperacionAsync", PropiedadPerfilOpcion, method);
        }

        public static void ObtenerPerfilOpcionAsync(Guid IdPerfil, Guid IdOpcion, Action<ObtenerPerfilOpcionCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ObtenerPerfilOpcionAsync", IdPerfil, IdOpcion, method);
        }

        public static void ActualizaPerfilFAsync(string perfilNombre, Guid perfilId, Action<ActualizaPerfilFCompletedEventArgs> method)
        {
            WcfProxyInvoker.InvocarMetodo(_clientStatic, "ActualizaPerfilFAsync", perfilNombre, perfilId, method);
        }
        #endregion
    }
}